package test_pkg

import "runtime"

//设置多核运算
/*
在 gc 编译器下（6g 或者 8g）你必须设置 GOMAXPROCS 为一个大于默认值 1 的数值来允许运行时支持使用多于 1 个的操作系统线程，
否则所有的协程都会共享同一个线程。
当 GOMAXPROCS 大于 1 时，会有一个线程池管理众多线程。gccgo 编译器 会使 GOMAXPROCS 与运行中的协程数量相等。
假设一个机器上有 n 个处理器或者核心。如果你设置环境变量 GOMAXPROCS>=n，或者执行 runtime.GOMAXPROCS(n)，
那么协程会被分割（或分散）到 n 个处理器上。
注意：增加处理器数量不意味着性能的 线性 提升
*/

//假设有 4 个核心
var NCPU = 4

func doAll() {
	sem := make(chan int, NCPU)
	for i := 0; i < NCPU; i++ {
		go doSingle(sem)
	}

	for i := 0; i < NCPU; i++ {
		//等待一个任务完成
		<-sem
	}
}

func doSingle(sem chan int) {
	//do somethind here

	//发送完成信号（信号量模式） 释放 sem 缓冲区
	sem <- 1
}

//启动
func Run_multi_core() {
	//设置最大线程数量为核心数量
	runtime.GOMAXPROCS(NCPU)
	doAll()
}
